﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Linq;
using Biciq.Web.UI.Servicios;

namespace Biciq.Silverlight.UI
{
    public class EditarEstacionVistaModelo:VistaModeloBase
    {
            
        #region campos
   
     
        private Visibility _mostrarAbrir;

        private Estacion _EstacionActual;
        private bool _modoEditar;
        private RelayCommand _comandoGuardar;
      
       
        private String _titulo;
       

        private bool _editarDatos;

        public bool EditarDatos
        {
            get { return _editarDatos; }
            set
            {
                _editarDatos = value;
                RaisePropertyChanged("EditarDatos");
            }
        }

        private string _status;

        private string _tituloNombre;

       
        #endregion

        #region comandos


    
       
        #endregion

        #region propiedades

        public string TituloNombre
        {
            get { return _tituloNombre; }
            set 
            {
                _tituloNombre = value;
                RaisePropertyChanged("TituloNombre");
            }
        }


        public string Status
        {
            get { return _status; }
            set
            {
                _status = value;
                RaisePropertyChanged("Status");

            }
        }
        public Visibility MostrarAbrir
        {
            get { return _mostrarAbrir; }
            set
            {
                _mostrarAbrir = value;
                RaisePropertyChanged("MostrarAbrir");
            }
        }
        

       



        /// <summary>
        /// Titulo de la pantalla
        /// </summary>
        public String Titulo
        {
            get { return _titulo; }
            set
            {
                _titulo = value;
                RaisePropertyChanged("Titulo");
            }
        }




        /// <summary>
        /// Estacion actual para editar o crear uno nuevo
        /// </summary>
        public Estacion EstacionActual
        {
            get { return _EstacionActual; }
            set
            {
                _EstacionActual = value;
                _EstacionActual.PropertyChanged += (ob, ev) =>
                {
                    //Indica si hubo cambios en el EstacionActual
                    IsDirty = true;
                    RaisePropertyChanged("EstacionActual." + ev.PropertyName);
                    if (ev.PropertyName == "Tipo")
                    {
                        if (_EstacionActual.Tipo == "Fija")
                        {
                            TituloNombre = "Nombre";
                        }

                        else
                        {
                            TituloNombre = "Placa";
                        }
                    }
                    
                };
                RaisePropertyChanged("EstacionActual");
            }
        }

        /// <summary>
        /// Propiedad que nos indica si un Estacion se va a editar
        /// </summary>
        public bool ModoEditar
        {
            get { return _modoEditar; }
            set
            {
                _modoEditar = value;
            }
        }


        #endregion

        #region constructores
        public EditarEstacionVistaModelo(Estacion Estacion)
        {
            TituloNombre = "Nombre / Placa";
            Procesando = true;
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            Titulo ="Editar Estacion";
            BiciqContexto.Estacions.Clear();
            var Estacions = BiciqContexto.Estacions;
            

                BiciqContexto.Load(BiciqContexto.GetRolsQuery()).Completed += delegate
                {
                    
                  

                    BiciqContexto.Load(BiciqContexto.GetEstacionIdQuery(Estacion.Id)).Completed += delegate
                    {
                        EstacionActual = Estacions.FirstOrDefault();
                        
                          IsDirty = false;
                            Procesando = false;

                            MostrarAbrir = Visibility.Collapsed;
                         

                    };
                };

            

            _modoEditar = true;
            EditarDatos = false;
         
        }

        public EditarEstacionVistaModelo()
        {
            Procesando = true;
            TituloNombre = "Nombre / Placa";
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            Titulo = "Crear Estacion";

            _modoEditar = false;
            EstacionActual = new Estacion();
           
            
            EstacionActual.Estado = RecursosLenguaje.Recursos.Activo;
            EstacionActual.Id = Guid.NewGuid();
            IsDirty = false;

        
              EditarDatos = true;
              MostrarAbrir = Visibility.Visible;

              Procesando = false;
        }
        #endregion

        #region metodos privados

     

        public void validarTarjeta()
        {
            Procesando = true;
            if (EstacionActual.Codigo != null && EstacionActual.Codigo != "")
            {
                BiciqContexto.Tarjetas.Clear();
                BiciqContexto. Load( BiciqContexto.GetTarjetaPorCodigoQuery(EstacionActual.Codigo)).Completed += delegate
                    {
                        Procesando = false;
                        var tarjeta = BiciqContexto.Tarjetas.FirstOrDefault();
                        if (tarjeta != null)
                        {

                            if (EstacionActual.Tarjeta != null)
                            {
                                EstacionActual.Tarjeta.Estado = "ELIMINADO";
                            }

                            EstacionActual.IdTarjeta = tarjeta.id;
                            tarjeta.Estado = "ASIGNADO";
                            EstacionActual.fechaAsignacion = DateTime.Now;
                            
                        }
                        else
                        {
                            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("El código ingresado no está ingresado en el Sistema o está asignado a otra estación, confirme con el administrador del Sistema", "Error Código Tarjeta", LogicStudio.Framework.UI.Utilidades.TipoVentana.Error);
                            EstacionActual.Codigo = "";
                        }
                        
                        
                    };
            }

        }
        /// <summary>
        /// Método en el cual se guarda el Estacion
        /// </summary>
        public override void  Guardar()

        {
            InicializarMensajesError(); 

           
            if (ValidarEntidadConMetadata(EstacionActual).Count>0)
            {
                return ;
            }

             

            BiciqDomainContext BiciqContextoaUX = new BiciqDomainContext();

            
            BiciqContextoaUX.Estacions.Clear();
      

             BiciqContextoaUX.Estacions.Clear();
             BiciqContextoaUX.Load(BiciqContextoaUX.GetEstacionNombreQuery(EstacionActual.Nombre)).Completed += delegate
             {
                var  Estaciones = BiciqContextoaUX.Estacions.ToList();
                if (Estaciones.FirstOrDefault() != null && Estaciones.FirstOrDefault().Id != EstacionActual.Id)
                 {
                     AgregarMensajeError("Existe un Estacion registrado con el mismo Nombre");

                     MostrarErrores = Visibility.Visible;
                 }
                 else
                 {

                     MostrarErrores = Visibility.Collapsed;
                     if (this.IsDirty)
                     {
                         if (!this.ModoEditar)
                         {
                             EstacionActual.Id = Guid.NewGuid();
                             BiciqContexto.Estacions.Add(EstacionActual);
                         }

                         BiciqContexto.SubmitChanges().Completed += delegate
                         {

                             if (!this.ModoEditar)
                             {
                                 LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar(string.Format(RecursosLenguaje.Recursos.MensajeRegistroExitoso, "Estación"), "Crear Estación", LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                             }
                             else
                             {
                                 LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar(string.Format(RecursosLenguaje.Recursos.MensajeActualizacionRegistro, "Estación"), "Editar Estación", LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                             }

                            
                             CerrarVentana();
                         };

                     }
                     else
                     {
                         CerrarVentana();
                     }
                 }

             };
           
        }


        public override void Cancelar()
        {
            base.Cancelar(BiciqContexto);
        }
        #endregion

        #region metodos publicos

        #endregion
    }
}
